#include"util.hpp"
#include"config.hpp"
#include"hot.hpp"
#include"service.hpp"
#include"data.hpp"
#include<thread>

void FileUtilTest(const std::string&filename)
{
    // cloud::FileUtil fu(filename);
    // std::cout<<fu.FileSize()<<std::endl;
    // std::cout<<fu.LastMTime()<<std::endl;
    // std::cout<<fu.LastATime()<<std::endl;
    // std::cout<<fu.FileName()<<std::endl;    
    // cloud::FileUtil fu(filename);
    // std::string body;
    // fu.GetContent(&body);
    // cloud::FileUtil nfu("./hello.txt");
    // nfu.SetContent(body);
    // std::string packname=filename+".lz";
    // cloud::FileUtil fu(filename);
    // fu.Compress(packname);
    // cloud::FileUtil pfu(packname);
    // pfu.Uncompress("./hello.txt");
    // return ;
    // cloud::FileUtil fu(filename);
    // fu.CreateDirectory();
    // std::vector<std::string>arry;
    // fu.ScanDirectory(&arry);
    // for(auto&a:arry)
    // {
    //     std::cout<<a<<std::endl;
    // }
    // return;
}
void JsonUtilTest()
{
    const char *name="小卢";
    int age=21;
    float score[]={85,88.5,99};
    Json::Value root;
    root["姓名"]=name;
    root["年龄"]=age;
    root["成绩"].append(score[0]);
    root["成绩"].append(score[1]);
    root["成绩"].append(score[2]);
    std::string json_str;
    Cloud::JsonUtil::Serialize(root,&json_str);
    // Cloud::JsonUtil::Serialize(root,&json_str);
    std::cout<<json_str<<std::endl;
    Json::Value val; 
    Cloud::JsonUtil::UnSerialize(json_str,&val);
    std::cout<<val["姓名"].asString()<<std::endl;
    std::cout<<val["年龄"].asInt()<<std::endl;
    for(int i=0;i<val["成绩"].size();i++)
    {
        std::cout<<val["成绩"][i].asFloat()<<std::endl;
    }
}
void ConfigTest()
{
    Cloud::Config*config=Cloud::Config::GetInstance();
    std::cout<<config->GetHotTime()<<std::endl;
    std::cout<<config->GetServerPort()<<std::endl;
    std::cout<<config->GetServerIp()<<std::endl;
    std::cout<<config->GetDownLoadPrefix()<<std::endl;
    std::cout<<config->GetPackFileSuffix()<<std::endl;
    std::cout<<config->GetPackDir()<<std::endl;
    std::cout<<config->GetBackDir()<<std::endl;
    std::cout<<config->GetBackupFile()<<std::endl;
}
void DataTest(const std::string &filename)
{
    // Cloud::BackupInfo info;
    // info.NewBackupInfo(filename);
    // Cloud::DataManager data;
    // std::cout<<"------------insert and getonebyurl------"<<std::endl;
    // data.Insert(info);
    // // std::cout<<info.pack_flag<<std::endl;
    // // std::cout<<info.fsize<<std::endl;
    // // std::cout<<info.mtime<<std::endl;
    // // std::cout<<info.atime<<std::endl;
    // // std::cout<<info.real_path<<std::endl;
    // // std::cout<<info.pack_path<<std::endl;
    // // std::cout<<info.url<<std::endl;
    // Cloud::BackupInfo tmp;
    // data.GetOneByRealPath("/download/bundle.h",&tmp);
    // std::cout<<tmp.pack_flag<<std::endl;
    // std::cout<<tmp.fsize<<std::endl;
    // std::cout<<tmp.mtime<<std::endl;
    // std::cout<<tmp.atime<<std::endl;
    // std::cout<<tmp.real_path<<std::endl;
    // std::cout<<tmp.pack_path<<std::endl;
    // std::cout<<tmp.url<<std::endl;
    // std::cout<<"------------dpate and getall------"<<std::endl;
    // info.pack_flag=true;
    // data.Update(info);
    // std::vector<Cloud::BackupInfo> arry;
    // data.GetAll(&arry);
    // for(auto&a:arry)
    // {
    //     std::cout<<a.pack_flag<<std::endl;
    //     std::cout<<a.fsize<<std::endl;
    //     std::cout<<a.mtime<<std::endl;
    //     std::cout<<a.atime<<std::endl;
    //     std::cout<<a.real_path<<std::endl;
    //     std::cout<<a.pack_path<<std::endl;
    //     std::cout<<a.url<<std::endl;
    // }
    // std::cout<<"------------getonebyrealpath------"<<std::endl;
    // data.GetOneByRealPath(filename,&tmp);
    // std::cout<<tmp.pack_flag<<std::endl;
    // std::cout<<tmp.fsize<<std::endl;
    // std::cout<<tmp.mtime<<std::endl;
    // std::cout<<tmp.atime<<std::endl;
    // std::cout<<tmp.real_path<<std::endl;
    // std::cout<<tmp.pack_path<<std::endl;
    // std::cout<<tmp.url<<std::endl;

    Cloud::DataManager data;
    std::vector<Cloud::BackupInfo>arry;
    data.GetAll(&arry);
    for(auto&a:arry)
    {
        std::cout<<a.pack_flag<<std::endl;
        std::cout<<a.fsize<<std::endl;
        std::cout<<a.mtime<<std::endl;
        std::cout<<a.atime<<std::endl;
        std::cout<<a.real_path<<std::endl;
        std::cout<<a.pack_path<<std::endl;
        std::cout<<a.url<<std::endl;
    }


}
Cloud::DataManager *_data;
void HotTest()
{
    _data=new Cloud::DataManager();
    Cloud::HotManager hot;
    hot.RunModule();
}
void ServiceTest()
{
    Cloud::Service srv;
    srv.RunModule();
}
int main(int argc,char *argv[])
{
    // FileUtilTest(argv[1]);
    // JsonUtilTest();
    // ConfigTest();
    // DataTest(argv[1]);
    // HotTest();
    // _data=new Cloud::DataManager();
    // ServiceTest();
    std::thread thread_hot_manager(HotTest);
    std::thread thread_service(ServiceTest);
    thread_hot_manager.join();
    thread_service.join();
    return 0;
}
